package com.gjt.stream;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;


/**
 * Created with Intel IDEA.
 *
 * InputStream (java.io)输入流:read,skip,available,close,mark,reset,markSupported
 *  read():从输入流中读取一个字节作为0-255的int 返回。流的结束可以通过返回-1 表示
 *  read(byte[] input):
 *  read(byte[] input, int offset, int length):
 *  markSupported:检查是否支持标记
 *  mark:标记流的当前位置；一个流在任意时候都只能有一个标记。之后就覆盖之前的标记
 *  reset:把流重置到标记的位置
 *  注意：BufferedInputSteam和ByteArrayInputStream 始终支持标记 。 或者串联到缓冲流的输入流时才支持标记
 *
 *
 * @Auther: gjt
 * @Date: 2024/3/19 16:43
 */
public class InStream {

    /**
     * 读取流中10 个字节 并返回;但是一次只读取 1个字节
     *
     * @param in 输入流
     * @return 返回读取的字节
     */
    private static byte[] read(InputStream in) throws IOException {
        byte[] input = new byte[10];
        for (int i = 0; i < input.length; i++) {
            // 返回的是0-255的无符号整数，但int 是-128 - 127 并且一次只能读取一个字节
            int b = in.read();
            if(b == -1) break;

            // 需要把结果类型转换
            input[i] = (byte) b;
        }
        return input;
    }


    /**
     * 返回读取的字节：并且是一次性读取1024
     *
     * @param in 输入流
     * @return byte[] 装了1024字节的数组
     * @throws IOException
     */
    private static byte[] readByte(InputStream in) throws IOException {
        // 如果只有512 个字节 就只能读取512
        byte[] input = new byte[1024];
        int b = in.read(input);
        System.out.println("读取"+b+"字节");
        return input;
    }

    // 完善第二方法
    private static byte[] readByte1(InputStream in) throws IOException {
        // 如果只有512 个字节 就只能读取512
        int byteRead = 0;
        int bytesToRead = 1024;
        byte[] input = new byte[bytesToRead];

        while(byteRead < bytesToRead){
            byteRead += in.read(input, byteRead, bytesToRead - byteRead);
            //在流的结束会返回 -1
            if(byteRead == -1)break;
        }
        return input;
    }

    // 完善第三方法
    private static byte[] readByte2(InputStream in) throws IOException {
        // 确定不阻塞的情况下有多少字节可以读取； 在流结束的时候会返回0
        int bytesAvailable = in.available();
        byte[] input = new byte[bytesAvailable];

        // 可以跳过n个字节
        long skip = in.skip(2);
        System.out.println("跳过"+skip+"字节");

        int read = in.read(input, 0, bytesAvailable);
        System.out.println("读取"+read+"字节");
        return input;
    }

    public static void main(String[] args) {

        try(InputStream in = Files.newInputStream(Paths.get("C:/Users/23152/Desktop/hello.txt"))){
            // 自己替换
            byte[] read = readByte2(in);
            // 把byte数组转成 字符串
            String s = new String(read);
            System.out.println(s);

            // 字符串转成byte数组
            byte[] bytes = s.getBytes();

        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
